/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Pojo.Atividade;
import Pojo.Turma;
import java.util.Calendar;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

/**
 *
 * @author thiago
 */
public class AtividadeDaoImplJPA implements AtividadeDao{
    
    	/**
	 * Adicionar uma Atividade ao banco de dados de Atividades
	 * @param atividade
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean inserir(Atividade atividade){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.persist(atividade);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
        	
	/**
	 * Remover Atividade do banco de dados de Atividades
	 * @param atividade
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean remover(Atividade atividade){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                Atividade atividadeAux = em.find(Atividade.class, atividade.getId());
                em.remove(atividadeAux);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
        /**
	 * Alterar Atividade do banco de dados de Atividades
	 * @param atividade
	 * @return true ou false indicando sucesso ou não
	 */
	public boolean alterar(Atividade atividade){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            try{
                tx.begin();
                em.merge(atividade);
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(false);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(true);
        }
        
        /**
	 * Pesquisa de Atividades passando o nome
	 * @param nome
	 * @return Lista de Atividades cujos nomes são iguais ao nome passado. A lista pode vir vazia indicando que não há nenhuma atividade com esse nome.  
	 */
	public List<Atividade> pesquisarPorNome(String nome){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Atividade> listaAtividade = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Atividade a where a.nome = :nome");
                query.setParameter("nome", nome);
                listaAtividade = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaAtividade);
        }
        
        	/**
	 * Pesquisa de Atividades passando uma data
	 * @param data
	 * @return Lista de Atividades cujas data são iguais à data passada. A lista pode vir vazia indicando que não há nenhuma atividade nesta data.
	 */
	public List<Atividade> pesquisarPorData(Calendar data){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Atividade> listaAtividade = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Atividade a where a.dataAtividade = :data");
                query.setParameter("data", data);
                listaAtividade = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaAtividade);
        }
        
        /**
	 * Pesquisa de Atividades passando uma turma
	 * @param turma
	 * @return Lista de Atividades cujas turmas são iguais à turma passada. A lista pode vir vazia indicando que não há nenhuma atividade com esta turma.
	 */
	public List<Atividade> pesquisarPorTurma(Turma turma){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            List<Atividade> listaAtividade = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Atividade a where a.turma = :turma");
                query.setParameter("turma", turma);
                listaAtividade = query.getResultList();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(listaAtividade);
        }
        
        /**
	 * Pesquisa de Atividades passando um id
	 * @param id
	 * @return Atividade 
	 */
	public Atividade pesquisarPorId(int id){
            EntityManager em = PersistenciaUtil.getEntityManager();
            EntityTransaction tx = em.getTransaction();
            Atividade atividade = null;
            try{
                tx.begin();
                Query query = em.createQuery("select a from Atividade a where a.id = :id");
                query.setParameter("id", id);
                atividade = (Atividade) query.getSingleResult();
                tx.commit();
            }catch(Exception e){
                if ((tx != null)&&(tx.isActive())){
                    tx.rollback();
                    return(null);
                }
            }finally{
                PersistenciaUtil.fecharConexao(em);
            }
            return(atividade);
        }
        
}
